#ifndef __MISC_BIT_BAND_H__
#define __MISC_BIT_BAND_H__

#define BIT_BAND_PERIPH(reg_addr, nbit) (*((volatile uint8_t *)(uint32_t)(0x42000000 + ((reg_addr) - 0x40000000) * 32U + nbit * 4U)))

#define DMA_CH_ENABLE(p, ch) (BIT_BAND_PERIPH((((p) + 0x10U) + 0x18U * (ch)), 0) = 0x01)           // DMA_CHxCTL 0
#define DMA_CH_DISABLE(p, ch) (BIT_BAND_PERIPH((((p) + 0x10U) + 0x18U * (ch)), 0) = 0x00)          // DMA_CHxCTL 0
#define DMA_CH_IS_ENABLE(p, ch) (BIT_BAND_PERIPH((((p) + 0x10U) + 0x18U * (ch)), 0) == 0x01)       // DMA_CHxCTL 0
#define DMA_CH_MEM_SWITCH(p, ch, n) (BIT_BAND_PERIPH((((p) + 0x10U) + 0x18U * (ch)), 19) = n)      // DMA_CHxCTL 19
#define DMA_CH_INT_FTF_ENABLE(p, ch) (BIT_BAND_PERIPH((((p) + 0x10U) + 0x18U * (ch)), 4) = 0x01)   // DMA_CHxCTL 4
#define DMA_CH_INT_FTF_DISABLE(p, ch) (BIT_BAND_PERIPH((((p) + 0x10U) + 0x18U * (ch)), 4) = 0x00)  // DMA_CHxCTL 4
#define DMA_CH_INT_FLAG_FTF_CLEAR(p, ch) (BIT_BAND_PERIPH((((p) + 0x08U) + (((ch) / 4) * 4)), (((ch % 4) / 2) * 16) + ((ch % 2) * 6) + 5) = 0x01)

#define TIMER_ENABLE(p) (BIT_BAND_PERIPH(((p) + 0x00), 0) = 0x01)              // TIMERx_CTL0 0
#define TIMER_DISABLE(p) (BIT_BAND_PERIPH(((p) + 0x00), 0) = 0x00)             // TIMERx_CTL0 0
#define TIMER_IS_ENABLE(p) (BIT_BAND_PERIPH(((p) + 0x00), 0) == 0x01)          // TIMERx_CTL0 0
#define TIMER_SOFT_UPDATE(p) (BIT_BAND_PERIPH(((p) + 0x14U), 0) = 0x01)        // TIMERx_SWEVG 0
#define TIMER_INT_FLAG_UP_CLEAR(p) (BIT_BAND_PERIPH(((p) + 0x10U), 0) = 0x00)  // TIMERx_INTF 0

#define SPI_ENABLE(p) (BIT_BAND_PERIPH(((p) + 0x00), 6) = 0x01)            // SPI_CTL0 6
#define SPI_DISABLE(p) (BIT_BAND_PERIPH(((p) + 0x00), 6) = 0x00)           // SPI_CTL0 6
#define SPI_INT_RBNE_ENABLE(p) (BIT_BAND_PERIPH(((p) + 0x04), 6) = 0x01)   // SPI_CTL1 6
#define SPI_INT_RBNE_DISABLE(p) (BIT_BAND_PERIPH(((p) + 0x04), 6) = 0x00)  // SPI_CTL1 6
#define SPI_RBNE_FLAG_GET(p) (BIT_BAND_PERIPH(((p) + 0x08), 0) == 0x01)    // SPI_STAT 0
#define SPI_DMA_TX_ENABLE(p) (BIT_BAND_PERIPH(((p) + 0x04), 1) = 0x01)     // SPI_CTL1 1
#define SPI_DMA_TX_DISABLE(p) (BIT_BAND_PERIPH(((p) + 0x04), 1) = 0x00)    // SPI_CTL1 1
#define SPI_DMA_RX_ENABLE(p) (BIT_BAND_PERIPH(((p) + 0x04), 0) = 0x01)     // SPI_CTL1 0
#define SPI_DMA_RX_DISABLE(p) (BIT_BAND_PERIPH(((p) + 0x04), 0) = 0x00)    // SPI_CTL1 0

#define GPIO_PIN_DO_SET(p, pin) (BIT_BAND_PERIPH(((p) + 0x18U), (pin)) = 0x01)         // GPIOx_BOP pin
#define GPIO_PIN_DO_RESET(p, pin) (BIT_BAND_PERIPH(((p) + 0x18U), (pin) + 16) = 0x01)  // GPIOx_BOP pin+16
#define GPIO_PIN_DO(p, pin, b) (BIT_BAND_PERIPH(((p) + 0x14U), (pin)) = (b))           // GPIOx_OCTL pin
#define GPIO_PIN_DI(p, pin) (BIT_BAND_PERIPH(((p) + 0x10U), (pin)))                    // GPIOx_ISTAT pin

#endif /* !__MISC_BIT_BAND_H__ */
